define(["jquery", "Underscore"], function(jQuery, underscore){
    underscore.Crud = function(){}
    underscore.Crud.prototype = {
        add:"",
        edit:"", 
        Delete:"",
        root:null,
        request:new underscore.Request(),
        
        prepare:function(){
            this.request.isJSON = false;
            this.request.useCache = false;
            this.request.beforeSend = this.beforeSend;
            
            jQuery(".add-button", this.root).live("click", {
                self:this
            }, function(e){
                var self = e.data.self;
                self.root.find(".editor").data("action", self.add);
                self.root.find("._required").addClass("required");
                e.data.self.clearForm();
                return false;
            });
            jQuery(".edit-button", this.root).live("click", {
                self:this
            }, function(e){
                var self = e.data.self; 
                var row = jQuery(this).parents("tr");
                var pk = row.data("pk");
                var url = self.edit + "&" + pk;
                
                self.root.find(".editor").data("action", url);
                self.doEdit(row);
                return false;
            });
            jQuery(".cancel-button", this.root).live("click", {
                self:this
            }, function(e){
                e.data.self.clearForm();
                return false;
            });
            jQuery(".save-button", this.root).live("click", {
                self:this
            }, function(e){
                var self = e.data.self;
                var errors = self.root.find(".error");
                
                if(errors.length == 0 || !errors.is(function(){
                    return jQuery(this).css("display") != "none";
                })){
                    jQuery("a.close").click();
                    e.data.self.save();
                }
                return false;
            });
            jQuery(".delete-button", this.root).live("click", {
                self:this
            }, function(e){
                var pk = jQuery(this).parents("tr").data("pk");
                e.data.self.doDelete(pk);
                return false;
            });
            
            jQuery(".cancel-button").live("click", {
                self:this
            }, function(e){
                jQuery("a.close").click();
            });
            
            jQuery(".close").live("click", {
                self:this
            }, function(e){
                e.data.self.root.find("._required").removeClass("required");
            });
            
            
        },
        clearForm:function(){},
        doEdit:function(){},
        doDelete:function(){},
        save:function(){},
        onSuccess:function(){},
        beforeSend:function(){
            this.root.html("Un momento por favor...");
        }
    }
    
    return underscore;
});


